<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ES6 set&WeakSet</title>
</head>

<body>
    <!-- Set数据结构，注意这里不是数据类型，而是数据结构。它是ES6中新的东西，并且很有用处。Set的数据结构是以数组的形式构建的。 -->
    <!-- Set和Map类似，也是一组key的集合，但不存储value。由于key不能重复，所以，在Set中，没有重复的key。 -->
    <!-- set 支持 add delete 新增或删除一个元素 -->
    <script>
        /**************************Set的声明******************************/
        let setArr = new Set(['xiaohui', '18', 'girl'])
        console.log(setArr)
        // 新增
        setArr.add(1)
        console.log(setArr)
        setArr.add(1)
        console.log(setArr)
        // 删除
        setArr.delete('18')
        console.log(setArr)
        // 查找
        // set的循环 for…of…循环：
        console.log(setArr.has('18'))
        for (let item of setArr) {
            console.log(item)
        }
        // size属性可以获得Set值的数量。
        console.log(setArr.size)
        // forEach循环
        setArr.forEach((val) => {
            console.log(val)  // xiaohui girl 1
        })
        //   清空
        setArr.clear()
        console.log(setArr)

        /**************************WeakSet的声明******************************/
        // 在实际开发中Set用的比较多，WeakSet用的并不多，但是他对传入值必须是对象作了很好的判断，我们灵活应用还是有一定的用处的
        let WeakObj = new WeakSet()
        let obj = { name: 'xiaohui', gender: 'girl', age: '18', hobby: 'swiming' }
        let obj1 = obj, obj2 = { figure: 'beautiful' }
        WeakObj.add(obj)
        WeakObj.add(obj1)
        WeakObj.add(obj2)
        console.log(WeakObj)
        // for (let item of WeakObj){
        //     console.log(item)  // set&Weakset.html:52 Uncaught TypeError: WeakObj is not iterable 因为WeakSet 对对象为弱引用  所以 WeakSet内有多少个成员 取决于 垃圾回收机制是否运行，运行前后很有可能数量不一致
        // }

        /***************************map 数据结构************************************/
        //map 与json区别

        let json = {
            name: 'huihui',
            age: 18
        }

        console.log(json.name)
        //map 可以把它看成一种特殊的键值对，但你的key可以设置成数组，值也可以设置成字符串，让它不规律对应起来  普通对象 不能以复杂类型作为KeyKey 值
        let mapA = new Map()
        // 新增值
        mapA.set(json, 'aa')
        console.log(mapA)
        // ** map的增删查**
        // 取值
        console.log(mapA.get(json))
        // 拿到map的数量
        console.log(mapA.size);
        //  ** 查找是否存在has **

        console.log(mapA.has(json))  // 以key 值为查找依据
        // 清楚所有元素clear
        mapA.set('name', 'haha')
        console.log(mapA.has('name'))
        mapA.clear()
        console.log(mapA)
        // // 删除 delete
        // mapA.delete(json)
        // console.log(mapA)


    </script>
</body>

</html>